package com.test;

import java.util.concurrent.atomic.AtomicStampedReference;

public class AtomicStampedReferenceDemo {

	static AtomicStampedReference<Integer> money = new AtomicStampedReference<Integer>(19, 0);

	public static void main(String[] args) {
		// 模拟多个线程更新后台数据库,为用户充值
		for (int i = 0; i < 3; i++) {
			final int timestamp = money.getStamp();
			new Thread() {
				@Override
				public void run() {
					while (true) {
						Integer m = money.getReference();
						if (m < 20) {
							if (money.compareAndSet(m, m + 20, timestamp, timestamp + 1)) {

								System.out.println("余额小于20,充值成功,余额：" + money.getReference());
								break;
							} else {
								System.out.println("余额大于20元,无需充值");
								break;
							}
						}
					}
				}
			}.start();

			// 用户消费线程
			new Thread() {
				public void run() {
					for (int j = 0; j < 100; j++) {
						while (true) {
							int timestamp = money.getStamp();
							Integer m = money.getReference();
							if (m > 10) {
								System.out.println("大于10元");
								if (money.compareAndSet(m, m - 10, timestamp, timestamp + 1)) {
									System.out.println("成功消费10元,余额：" + money.getReference());
									break;
								}
							} else {
								System.out.println("没有足够的金额");
								break;
							}
						}

						try {
							Thread.sleep(100);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
				};
			}.start();
			;
		}
	}
}
